home *** CD-ROM | disk | FTP | other *** search
/ The Programmer Disk / The Programmer Disk (Microforum).iso / xpro / c3 / pro19 / text_win.asm < prev    next >
Assembly Source File  |  1992-11-03  |  5KB  |  203 lines

  1. _gettextimage  proto far C, row1:SWORD, col1:SWORD, row2:SWORD, col2:SWORD
  2. _puttextimage  proto far C ,
  3.            row1:SWORD, col1:SWORD, row2:SWORD, col2:SWORD, buffer:WORD
  4.  
  5. IFNDEF ENOMEM
  6. ENOMEM EQU 12
  7. ENDIF
  8.  
  9. .model large, C
  10. .286
  11. .code
  12. ;* This procedure should be the counterpart for textmodes
  13. ;* to the QuickC - library function _getimage function for graphic modes;
  14. ;* use _puttextimage function listed below for restoring.
  15.  
  16. ;* unsigned int _gettextimage (short row1, short col1,
  17. ;*                      short row2, short col2)
  18.  
  19. ;* _gettextimage: expecting: - absolute coordinates (row, column) of specified
  20. ;*                   screen region in textmode
  21. ;*
  22. ;*          returns:
  23. ;*                 - address of memory where region is saved
  24. ;*                   (paragraph)
  25.  
  26.  
  27. _gettextimage  proc far C  ,
  28.            row1:SWORD, col1:SWORD, row2:SWORD, col2:SWORD
  29.  
  30.            LOCAL rows:WORD, cols:WORD, buffer:WORD
  31.  
  32.                mov ah, 0Fh
  33.            int 10h              ; get video mode
  34.  
  35.                .IF (al >= 4 && al <= 6) || (al >= 0dh)
  36.            mov ax, 0          ; if graphic mode
  37.            jmp @exit          ; return (with optional code in AX)
  38.            .ENDIF
  39.  
  40.            .IF al == 7 || !al      ; if monochrome
  41.            mov buffer, 0b000h
  42.            .ELSE              ; else VGA
  43.            mov buffer, 0b800h
  44.            .ENDIF              ; 'buffer' = video buffer
  45.  
  46.                push ax
  47.                mov ax, 1000h
  48.            shr bx, 8          ; BX = video page
  49.            mul bx
  50.            add buffer, ax          ; get address of current page
  51.                pop ax
  52.  
  53.            mov rows, 25          ; suppose 25 rows for simplicity
  54.                       ; (normal text mode)
  55.            shr ax, 8          ; AH = number of textcolumns
  56.            mov cols, ax
  57.  
  58.            mov ax, col2
  59.            sub ax, col1
  60.            add ax, 1
  61.            mov dx, row2
  62.            sub dx, row1
  63.            add dx, 1           ; compute n° of words needed to
  64.            mul dx               ; store screen region
  65.  
  66.            shr ax, 2
  67.            add ax, 1           ; paragraphs needed
  68.            mov bx, ax
  69.            mov ah, 48h
  70.            int 21h               ; allocate memory
  71.            jnc @F
  72.            mov ax, ENOMEM
  73.            jmp @exit
  74.  
  75.        @@: push ax
  76.            mov ax, 2
  77.            int 33h                ; turn mouse off
  78.            pop es                ; ES = allocated memory
  79.            push ds
  80.            xor di, di
  81.            mov ax, buffer            ; fit DS:SI
  82.            mov ds, ax
  83.            mov ax, es
  84.            mov buffer, ax            ; buffer: now memory block
  85.            mov ax, row1
  86.            dec ax
  87.            mov bx, col1
  88.            dec bx                ; get coordinates
  89.            .REPEAT
  90.            .REPEAT
  91.            push ax
  92.            push bx
  93.            mov bx, cols
  94.            mul bx                  ; AX = row * col
  95.            pop bx
  96.            add ax, bx              ; AX = (row * col) + col
  97.            mov si, ax
  98.            shl si, 1              ; TWO words/screen position
  99.            mov ax, word ptr ds:[si]
  100.            mov word ptr es:[di], ax          ; save
  101.            add di, 2
  102.            inc bx                  ; col = col + 1
  103.            pop ax
  104.            .UNTIL bx > col2
  105.            inc ax                  ; row = row + 1
  106.            mov bx, col1
  107.            dec bx
  108.            .UNTIL ax > row2
  109.            pop ds                  ; restore DS
  110.  
  111.            mov ax, 1
  112.            int 33h                  ; turn mouse on
  113.            mov ax, buffer              ; return memory address
  114. @exit:           ret
  115. _gettextimage  endp
  116.  
  117. ;** The next procedure restores the previously saved text screen image;
  118. ;** it expects the coordinates where to locate it an the address of the
  119. ;** memory block where it is saved. The allocated memory is then freed.
  120.  
  121. ;* int _puttextimage (short row1, short col1,
  122. ;*                  short row2, short col2, unsigned int buffer);
  123. _puttextimage  proc far C ,
  124.            row1:SWORD, col1:SWORD, row2:SWORD, col2:SWORD, buffer:WORD
  125.  
  126.            LOCAL cols:WORD
  127.  
  128.            push es
  129.  
  130.            mov ax, 2            ; turn mouse off
  131.            int 33h
  132.  
  133.                mov ah, 0Fh
  134.            int 10h                ; get video mode
  135.                push ax
  136.  
  137.                .IF al == 7 || !al
  138.            mov ax, 0b000h
  139.            .ELSE
  140.            mov ax, 0b800h
  141.            .ENDIF
  142.            mov es, ax
  143.  
  144.            mov ax, 1000h
  145.            shr bx, 8
  146.            mul bx
  147.            mov bx, es
  148.            add bx, ax
  149.            mov es, bx            ; get address of current page
  150.                pop ax
  151.  
  152.            shr ax, 8            ; AH = number of textcolumns
  153.            mov cols, ax
  154.  
  155.            push ds
  156.            mov ax, buffer
  157.            mov ds, ax
  158.            xor si, si            ; fit DS:SI
  159.  
  160.            mov ax, row1
  161.            dec ax
  162.            mov bx, col1
  163.            dec bx
  164.            .REPEAT
  165.            .REPEAT
  166.            push ax
  167.            push bx
  168.            mov bx, cols
  169.            mul bx                  ; AX = row * col
  170.            pop bx
  171.            add ax, bx              ; AX = (row * col) + col
  172.            mov di, ax
  173.            shl di, 1              ; TWO words/screen position
  174.            mov ax, word ptr ds:[si]
  175.            mov word ptr es:[di], ax          ; write to screen
  176.            add si, 2
  177.            inc bx                  ; col = col + 1
  178.            pop ax
  179.            .UNTIL bx > col2
  180.            inc ax                  ; row = row + 1
  181.            mov bx, col1
  182.            dec bx
  183.            .UNTIL ax > row2
  184.  
  185.            pop ds
  186.            mov ax, buffer
  187.            mov es, ax
  188.            mov ah, 49h
  189.            int 21h                  ; free allocated memory
  190.            jnc @exit
  191.            mov ax, ENOMEM              ; on error return ENOMEM
  192.            jmp @F
  193.        @exit:  mov ax, 0              ; if successful return 0
  194.       @@:  push ax
  195.            mov ax, 1              ; turn mouse cursor on
  196.            int 33h
  197.            pop ax
  198.            pop es
  199.            ret
  200. _puttextimage  endp
  201.  
  202. end
  203.